﻿Imports TepcelDominio
Imports TepcelBL
Public Class frmGuiaRemision
    Public Shared Property numeroNotaSalida As Integer = 19
    Public Shared Property NotaAlmacen As NotaAlmacen
    Private Property GuiaRemision As List(Of GuiaRemision)

    Dim numeroFilFor As Integer = 9
    Dim numeroSerFila As Integer = 3

    Dim NotaAlmacenBL As New NotaAlmacenBL
    Dim MotivoBL As New MotivoTrasladoBL
    Dim EmpresaBL As New EmpresaBL
    Dim ListaEmpresaDestino As New List(Of Empresa)
    Dim ListaEmpresaTransporte As New List(Of Empresa)

    Dim err As New System.Windows.Forms.ErrorProvider

    Private Sub CrearGuias()
        Dim i As Integer
        Dim ns As Integer
        Dim ds As Integer
        Dim nsa As Integer
        Dim cq As Integer
        Dim inicio As Integer
        Dim fin As Integer
        GuiaRemision = Nothing
        GuiaRemision = New List(Of GuiaRemision)

        agregarGuia()

        For i = 0 To NotaAlmacen.DetalleAlmacen.Count - 1
            cq = cuantoQueda()
            ns = cq * 3
            ds = ns - NotaAlmacen.DetalleAlmacen(i).Series.Count
            If ds >= 0 Then
                agregarDetalleSeries(i, 0, NotaAlmacen.DetalleAlmacen(i).Series.Count - 1)
            Else
                fin = -1
                Do
                    cq = cuantoQueda()
                    If cq = 0 Then
                        agregarGuia()
                        cq = cuantoQueda()
                    End If
                    nsa = cq * 3
                    inicio = fin + 1
                    fin = inicio + nsa - 1
                    agregarDetalleSeries(i, inicio, fin)
                Loop While fin >= NotaAlmacen.DetalleAlmacen(i).Series.Count - 1
            End If
        Next

    End Sub

    Private Sub agregarDetalleSeries(ByVal index As Integer, ByVal inicioSeries As Integer, ByVal finSeries As Integer)
        Dim i As Integer
        Dim detalle As GuiaRemision.DetalleGuiaRemision
        Dim series As GuiaRemision.DetalleGuiaRemision.SerieProductoGuiaRemision
        If finSeries > NotaAlmacen.DetalleAlmacen(index).Series.Count - 1 Then
            finSeries = NotaAlmacen.DetalleAlmacen(index).Series.Count - 1
        End If
        detalle = New GuiaRemision.DetalleGuiaRemision
        detalle.Producto = NotaAlmacen.DetalleAlmacen(index).Producto
        detalle.cantidadProducto = NotaAlmacen.DetalleAlmacen(index).cantidadNotaAlmacen
        GuiaRemision(GuiaRemision.Count - 1).DetalleGuia.Add(detalle)
        For i = inicioSeries To finSeries
            series = New GuiaRemision.DetalleGuiaRemision.SerieProductoGuiaRemision
            series.DetalleExistencia = NotaAlmacen.DetalleAlmacen(index).Series(i).DetalleExistencia
            GuiaRemision(GuiaRemision.Count - 1).DetalleGuia(GuiaRemision(GuiaRemision.Count - 1).DetalleGuia.Count - 1).Series.Add(series)
        Next
    End Sub

    Private Function numeroFilasSerie(ByVal numeroSeires As Integer) As Integer
        Dim ns As Integer
        ns = numeroSeires
        If ns Mod 3 = 0 Then
            ns = ns / 3
        Else
            ns = CInt(ns / 3) + 1
        End If
        Return ns
    End Function

    Private Function cuantoQueda() As Integer
        Dim i As Integer
        Dim nf As Integer = GuiaRemision(GuiaRemision.Count - 1).DetalleGuia.Count
        Dim ns As Integer = 0
        For i = 0 To GuiaRemision(GuiaRemision.Count - 1).DetalleGuia.Count - 1
            nf = nf + numeroFilasSerie(GuiaRemision(GuiaRemision.Count - 1).DetalleGuia(i).Series.Count)
        Next
        Return (numeroFilFor - 1) - nf
    End Function

    Private Sub agregarGuia()
        Dim Guia As New GuiaRemision
        Guia.codigoGuiaRemision = " "
        Guia.serieGuiaremision = NotaAlmacen.Almacen.serieAlmacen
        Guia.direccionPartida = txtDireccionPartida.Text.Trim
        Guia.direccionLlegada = txtDireccionLlegada.Text.Trim
        Guia.fechaEmision = UCase(Format(Date.Now, "d/MM/yyyy"))
        Guia.fechaInicioTraslado = CDate(txtFechaInicioTraslado.Text)
        Guia.Motivo.codigoMotivo = CBEMotivoTraslado.SelectedValue
        Guia.EmpresaDestino.codigoEmpresa = CBEDNombre.SelectedValue
        Guia.EmpresaTransporte.codigoEmpresa = CBETNombre.SelectedValue
        Guia.codigoUsuario = "L001"
        Guia.NotaAlmacen = NotaAlmacen
        Guia.estadoGuiaRemision = "E"
        GuiaRemision.Add(Guia)
        Guia = Nothing
    End Sub


    Private Sub cargarNotaSalida()
        NotaAlmacen = Nothing
        NotaAlmacen = NotaAlmacenBL.GetByIdFromNotaAlmacen(numeroNotaSalida)
        txtCodigoNota.Text = NotaAlmacen.codigoNotaAlmacen
        txtSerie.Text = NotaAlmacen.Almacen.serieAlmacen
        txtFechaEmision.Text = UCase(Format(Date.Now, "d/MM/yyyy"))

        DGVDetalle.Rows.Clear()
        Dim i As Integer
        For i = 0 To NotaAlmacen.DetalleAlmacen.Count - 1
            DGVDetalle.Rows.Add()
            DGVDetalle.Rows(DGVDetalle.Rows.Count - 1).Cells(0).Value = NotaAlmacen.DetalleAlmacen(i).Producto.codigoProducto
            DGVDetalle.Rows(DGVDetalle.Rows.Count - 1).Cells(1).Value = NotaAlmacen.DetalleAlmacen(i).Producto.nombreProducto
            DGVDetalle.Rows(DGVDetalle.Rows.Count - 1).Cells(2).Value = NotaAlmacen.DetalleAlmacen(i).cantidadNotaAlmacen
        Next

        Call CargarListaMotivos()
        Call CargarListaEmpresa()

    End Sub

    Private Sub llenarSeries(ByVal index As Integer)
        DGVSeries.Rows.Clear()
        If NotaAlmacen Is Nothing Then Return
        If NotaAlmacen.DetalleAlmacen.Count = 0 Then Return
        If DGVDetalle.CurrentRow.Cells(0).Value Is Nothing Then Return
        Dim i As Integer
        For i = 0 To NotaAlmacen.DetalleAlmacen(index).Series.Count - 1
            DGVSeries.Rows.Add(NotaAlmacen.DetalleAlmacen(index).Series(i).DetalleExistencia.serieProducto)
        Next
    End Sub

    Private Sub frmGuiaRemision_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Call cargarNotaSalida()
    End Sub

    Private Sub DGVDetalle_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DGVDetalle.SelectionChanged
        Call llenarSeries(DGVDetalle.CurrentRow.Index)
    End Sub

    Private Sub CargarListaMotivos()
        Dim ListaMotivo As New List(Of MotivoTraslado)
        ListaMotivo = MotivoBL.GetAllFromMotivo
        CBEMotivoTraslado.DataSource = Nothing
        CBEMotivoTraslado.DataSource = ListaMotivo
        CBEMotivoTraslado.DisplayMember = "nombreMotivo"
        CBEMotivoTraslado.ValueMember = "codigoMotivo"
    End Sub

    Private Sub CargarListaEmpresa()
        ListaEmpresaDestino = EmpresaBL.GetAllFromEmpresa
        CBEDNombre.DataSource = Nothing
        CBEDNombre.DataSource = ListaEmpresaDestino
        CBEDNombre.DisplayMember = "nombreEmpresa"
        CBEDNombre.ValueMember = "codigoEmpresa"
        CBEDRuc.DataSource = Nothing
        CBEDRuc.DataSource = ListaEmpresaDestino
        CBEDRuc.DisplayMember = "rucEmpresa"
        CBEDRuc.ValueMember = "codigoEmpresa"

        ListaEmpresaTransporte = EmpresaBL.GetAllFromEmpresa
        CBETNombre.DataSource = Nothing
        CBETNombre.DataSource = ListaEmpresaTransporte
        CBETNombre.DisplayMember = "nombreEmpresa"
        CBETNombre.ValueMember = "codigoEmpresa"
        CBETRuc.DataSource = Nothing
        CBETRuc.DataSource = ListaEmpresaTransporte
        CBETRuc.DisplayMember = "rucEmpresa"
        CBETRuc.ValueMember = "codigoEmpresa"
    End Sub


    Private Sub CBEMotivoTraslado_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles CBEMotivoTraslado.GotFocus, CBEDNombre.GotFocus, CBETNombre.GotFocus, CBEDRuc.GotFocus, CBETRuc.GotFocus
        sender.SelectionStart = 0
        sender.SelectionLength = sender.Text.Length
    End Sub

    Private Sub CBECategoria_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles CBEMotivoTraslado.KeyUp, CBEDNombre.KeyUp, CBETNombre.KeyUp, CBEDRuc.KeyUp, CBETRuc.KeyUp
        Dim sTexto As String
        Dim indiceEncontrado As Integer
        Dim itemEncontrado As Object
        Dim textoItem As String
        Dim agregarTexto As String


        Select Case e.KeyCode
            Case Keys.Back, Keys.Left, Keys.Right, Keys.Up, Keys.Delete, Keys.Down, Keys.Tab
                Return
        End Select

        sTexto = sender.Text
        indiceEncontrado = sender.FindString(sTexto)

        If indiceEncontrado >= 0 Then
            itemEncontrado = sender.Items(indiceEncontrado)
            textoItem = sender.GetItemText(itemEncontrado)

            agregarTexto = textoItem.Substring(sTexto.Length)
            sender.Text = sTexto & agregarTexto

            sender.SelectionStart = sTexto.Length
            sender.SelectionLength = agregarTexto.Length

        End If

    End Sub

    
    Private Sub btnGenerar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGenerar.Click
        If txtNumeroGuiaInicio.Text.Trim.Length = 0 Then
            err.SetError(txtNumeroGuiaInicio, "Ingrese el Numero de Guía de Inicio para Generar las Guías")
            Return
        Else
            err.SetError(txtNumeroGuiaInicio, "")
        End If

        If CBEMotivoTraslado.Text.Trim.Length = 0 Then
            err.SetError(CBEMotivoTraslado, "Seleccione el Motivo del Traslado")
            Return
        Else
            err.SetError(CBEMotivoTraslado, "")
        End If

        If txtDireccionPartida.Text.Trim.Length = 0 Then
            err.SetError(txtDireccionPartida, "Ingrese la dirección de partida")
            Return
        Else
            err.SetError(txtDireccionPartida, "")
        End If

        If txtDireccionLlegada.Text.Trim.Length = 0 Then
            err.SetError(txtDireccionLlegada, "Ingrese la dirección de llegada")
            Return
        Else
            err.SetError(txtDireccionLlegada, "")
        End If

        If txtFechaInicioTraslado.Text.Trim.Length = 0 Then
            err.SetError(txtFechaInicioTraslado, "Ingrese la Fecha de Inicio de Traslado")
            Return
        Else
            err.SetError(txtFechaInicioTraslado, "")
        End If

        If CBEDNombre.Text.Trim.Length = 0 Then
            err.SetError(CBEDNombre, "Seleccione la Empresa Destino")
            Return
        Else
            err.SetError(CBEDNombre, "")
        End If

        If CBETNombre.Text.Trim.Length = 0 Then
            err.SetError(CBETNombre, "Seleccione la Empresa Transportista")
            Return
        Else
            err.SetError(CBETNombre, "")
        End If


        Call CrearGuias()


        txtNumeroGuias.Text = GuiaRemision.Count

        'Insertamos las Guías
        Dim GuiaBL As New GuiaRemisionBL
        Dim numInicio As Integer
        numInicio = CInt(txtNumeroGuiaInicio.Text.Trim)

        Dim i As Integer
        For i = 0 To GuiaRemision.Count - 1
            GuiaRemision(i).numeroGuiaRemision = numInicio
            GuiaBL.NuevoGuiaRemision(GuiaRemision(i))
            numInicio = numInicio + 1
        Next




    End Sub
End Class